package com.example.bookkeepingelf.business.database;

import androidx.room.Database;
import androidx.room.Room;
import androidx.room.RoomDatabase;
import androidx.room.TypeConverters;


import android.content.Context;

import com.example.bookkeepingelf.business.database.converter.BigDecimalConverter;
import com.example.bookkeepingelf.business.database.converter.BooleanConverter;
import com.example.bookkeepingelf.business.database.converter.DateConverter;
import com.example.bookkeepingelf.business.database.dao.AccountBookDao;
import com.example.bookkeepingelf.business.database.dao.UserDao;
import com.example.bookkeepingelf.business.database.entity.AccountBook;
import com.example.bookkeepingelf.business.database.entity.User;



/**
 * @Database标签用于告诉系统这是Room数据库对象。
 * entities属性用于指定该数据库有哪些表，若需建立多张表，以逗号相隔开。
 * version属性用于指定数据库版本号，后续数据库的升级正是依据版本号来判断的。
 * 该类需要继承自RoomDatabase，在类中，通过Room.databaseBuilder()结合单例设计模式，完成数据库的创建工作。
 * 另外，我们创建的Dao对象，在这里以抽象方法的形式返回，只需一行代码即可。
 *
 */
@Database(entities = {User.class, AccountBook.class}, version = 3, exportSchema = false)
@TypeConverters({BigDecimalConverter.class, DateConverter.class, BooleanConverter.class})
public abstract class AppDatabase extends RoomDatabase {
    public abstract UserDao userDao();

    // 其他Dao对象 。。。。。
    public abstract AccountBookDao accountBookDao();


    /**
     * 单例模式
     */
    private static volatile AppDatabase INSTANCE;

    public static AppDatabase getDatabase(final Context context) {
        if (INSTANCE == null) {
            synchronized (AppDatabase.class) {
                if (INSTANCE == null) {
                    INSTANCE = Room.databaseBuilder(context.getApplicationContext(),
                                    AppDatabase.class, "my_database")
                            .fallbackToDestructiveMigration()// 允许破坏性迁移
                            .build();
                }
            }
        }
        return INSTANCE;
    }
}
